import java.awt.Color;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class GUI extends JFrame {
	// Datos del mapa
	JLabel[][] labels;
	int filas;
	int columnas;
	int pixel;

	// Datos del agente
	int x;
	int y;
	Color anterior = null;

	// labels.
	JLabel agente;
	JLabel movidas;
	private boolean [][] observado;
	private char [][] mapa;
	private int goalX;
	private int goalY;
	
	private GUIAgent updateGUI;
	
	private boolean oculto=false;  // controla si es que ocultamos las celdas nunca observadas 

	public GUI(char[][] mapa, int agentX, int agentY, int goalX, int goalY,boolean[][] observado) {
		// Se inician los datos de la GUI.
		this.filas = mapa.length;
		this.mapa = mapa;
		this.columnas = mapa[0].length;
		this.labels = new JLabel[filas][columnas];
		this.pixel = 2;
		this.goalX=goalX;
		this.goalY=goalY;
		this.observado=observado;
		this.setTitle("IIC2613 Simulador de la Búsqueda");

		// Creamos al agente
		agente = new JLabel();
		agente.setOpaque(true);
		agente.setBounds(agentX * pixel, agentY * pixel, pixel, pixel);
		agente.setBackground(Color.yellow);
		this.add(agente);

		// Creamos al agente
		movidas = new JLabel();
		movidas.setBounds(10, 5, 200, 20);
		movidas.setForeground(Color.yellow);
		this.add(movidas);

		updateGUI=new GUIAgent(agente,movidas,pixel);
		
		
		// Recorremos el mapa y pintamos la ventana.
		for (int i = 0; i < filas; i++) {
			for (int j = 0; j < columnas; j++) {
				JLabel label = new JLabel();
				label.setOpaque(true);
				label.setBounds(i * pixel, j * pixel, pixel, pixel);
				if (!oculto || observado[i][j]) 
					label.setBackground(getColor(mapa[i][j]));
				else 
					label.setBackground(Color.black);
				this.add(label);
				labels[i][j] = label;
			}
		}
		labels[goalX][goalY].setBackground(Color.red);
		
		this.setLayout(null);
		this.setSize(filas * pixel, columnas * pixel);
		this.setVisible(true);
		this.requestFocus();


	}

	private Color getColor(char a) {
		switch (a) {
		case '.':
		case 'g':
		case 'G':
			return Color.gray;
		case 'S':
			return Color.blue;
		case '@':
		case 'W':
			return Color.darkGray;
		case 'T':
			return Color.green;
		default:
			return Color.black;
		}

	}
	
	private int x_agente;
	private int y_agente;
	private int movidas_actual;
	
	public void run() {
		agente.setBounds(x_agente * pixel, y_agente * pixel, pixel, pixel);
		movidas.setText("moves: " + movidas_actual);
		agente.repaint();
		movidas.repaint();	
	}

	public void Actualizar(int x_agente, int y_agente, int movidas_actual) {
	
		updateGUI.update(x_agente,y_agente,movidas_actual);
		EventQueue.invokeLater(updateGUI);
		
	}
}
